home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1986-01-24 | 3.5 KB | 129 lines |
- 10 'Real Time Perspective Image of Rotated Globe
- 20 '
- 30 'Original program by: Karl Koessel
- 40 '
- 50 'Animation by: Andrew Tuline
- 60 '
- 70 'This program has been modified from the original submitted to
- 80 'PCWORLD magazine. The initialization draws 5 different images
- 90 'and stores the array for each image to disk. This process requires
- 100 'about 15 minutes. The data file GLOBE.DAT is stored to disk.
- 110 'The program checks for this data file, and if not available, will
- 120 'create one. Once this file has been created, the program will load
- 130 'it into the corresponding arrays, and will display a realtime rotating
- 140 'globe in the Screen 2 mode. The globe occupies a small section of the
- 150 'screen and shows best results when used with an RGB monitor. This seems
- 160 'a good example of non-flickering graphics in Basic.
- 170 '
- 180 '
- 190 RANDOMIZE VAL(LEFT$(TIME$,2))
- 200 SCREEN 2:CLS:KEY OFF:DEFINT L,R,X-Z
- 210 OUT &H3D9,3
- 220 DIM RC(11),A%(380),B%(380),C%(380),D%(380),E%(380)
- 230 ON ERROR GOTO 1230
- 240 OPEN "GLOBE.DAT" FOR INPUT AS #1
- 250 FOR I=0 TO 380:INPUT #1,A%(I):NEXT
- 260 FOR I=0 TO 380:INPUT #1,B%(I):NEXT
- 270 FOR I=0 TO 380:INPUT #1,C%(I):NEXT
- 280 FOR I=0 TO 380:INPUT #1,D%(I):NEXT
- 290 FOR I=0 TO 380:INPUT #1,E%(I):NEXT
- 300 CLS:X=320:Y=100
- 310 ON INT(RND*4)+1 GOTO 320,330,340,350,310
- 320 X=X+1:IF X>530 THEN X=530:GOTO 360 ELSE 360
- 330 X=X-1:IF X<0 THEN X=0:GOTO 360 ELSE 360
- 340 Y=Y-1:IF Y<0 THEN Y=0:GOTO 360 ELSE 360
- 350 Y=Y+1:IF Y>146 THEN Y=146:GOTO 360 ELSE 360
- 360 PUT (X,Y),A%,PSET
- 370 PSET (RND*639,RND*199),0
- 380 PUT (X,Y),B%,PSET
- 390 PSET (RND*639,RND*199),1
- 400 PUT (X,Y),C%,PSET
- 410 PSET (RND*639,RND*199),0
- 420 PUT (X,Y),D%,PSET
- 430 PSET (RND*639,RND*199),1
- 440 PUT (X,Y),E%,PSET
- 450 PSET (RND*639,RND*199),0
- 460 A$=INKEY$:IF A$="" THEN 310 ELSE END
- 470 OPEN "GLOBE.DAT" FOR OUTPUT AS #1
- 480 CX=CY:CZ=SX:SY=SZ:I=J:R=A:B=C:A1=B2:C1=C2
- 490 A3=B3:X=Y:XC=YC:LX=LY:B$=C$:RC=PI:LZ=ZS:Q=DR
- 500 FOR X=1 TO 11
- 510 RC(X)=(X-1)MOD 3+1
- 520 IF X>6 THEN RC(X)=(5-RC(X))MOD 3+1
- 530 NEXT
- 540 PI=3.14159
- 550 CF=PI/180
- 560 GOSUB 1160
- 570 FOR YROT=120 TO 132 STEP 3
- 580 GOSUB 660
- 590 GET (265,73)-(373,126),A%
- 600 FOR I=0 TO 380:PRINT #1,A%(I):NEXT
- 610 NEXT
- 620 BEEP:SOUND 32000,1:BEEP:SOUND 32000,1:BEEP:SOUND 32000,1:BEEP:SOUND 32000,1:BEEP
- 630 CLOSE #1
- 640 A$=INKEY$:IF A$<>"" THEN 640
- 650 GOTO 240
- 660 CX=COS(CF*XROT+ATN(YOBS/ZOBS)):SX=SIN(CF*XROT+ATN(YOBS/ZOBS))
- 670 CY=COS(CF*YROT+ATN(XOBS/ZOBS)):SY=SIN(CF*YROT+ATN(XOBS/ZOBS))
- 680 CZ=COS(CF*ZROT):SZ=SIN(CF*ZROT)
- 690 ZOBS=SQR(XOBS^2+YOBS^2+ZOBS^2)
- 700 ZS=R^2/ZOBS
- 710 CLS
- 720 LOCATE 1,1:PRINT"Initializing GLOBE.DAT. 5 beeps will sound upon completion"
- 730 LOCATE 5,5:PRINT USING "Picture # of 5";(YROT-117)/3
- 740 FOR I=0 TO 3 STEP PI/12
- 750 RC=(I*12/PI+2)MOD 3+1
- 760 C$=STR$(RC)
- 770 C$="3"
- 780 FOR J=0 TO 2.0001*PI STEP PI/24
- 790 A=R*SIN(I)*SIN(J)
- 800 B=R*COS(J)
- 810 C=R*COS(I)*SIN(J)
- 820 GOSUB 990
- 830 GOSUB 1090
- 840 NEXT
- 850 NEXT
- 860 FOR I=PI/12 TO 11*PI/12 STEP PI/12
- 870 RC=RC(I*12/PI)
- 880 C$=STR$(RC)
- 890 C$="3"
- 900 FOR J=0 TO 2.0001*PI STEP PI/24
- 910 A=R*SIN(I)*SIN(J)
- 920 B=R*COS(I)
- 930 C=R*SIN(I)*COS(J)
- 940 GOSUB 990
- 950 GOSUB 1090
- 960 NEXT
- 970 NEXT
- 980 RETURN
- 990 A1=A*CY-C*SY
- 1000 C1=A*SY+C*CY
- 1010 B2=B*CX-C1*SX
- 1020 C2=B*SX+C1*CX
- 1030 A3=A1*CZ-B2*SZ
- 1040 B3=A1*SZ+B2*CZ
- 1050 DR=C2/(ZOBS-C2)+1
- 1060 X=INT(A3*DR*ASP+XC)
- 1070 Y=INT(B3*-DR+YC)
- 1080 RETURN
- 1090 IF C2<ZS OR LZ<ZS THEN B$="BC":GOTO 1120
- 1100 Q=(X<0)+(X>639)+(Y<0)+(Y>199)+(LX<0)+(LX>639)+(LY<0)+(LY>199)
- 1110 IF Q+(J=0) THEN B$="BC" ELSE B$="C"
- 1120 LX=X:LY=Y
- 1130 LZ=C2
- 1140 DRAW B$+C$+"M"+STR$(X)+","+STR$(Y)
- 1150 RETURN
- 1160 XC=320:YC=100
- 1170 XOBS=-9:YOBS=0:ZOBS=456
- 1180 XROT=37:ZROT=23:'YROT=-123
- 1190 R=25
- 1200 BCK=1:PAL=1
- 1210 ASP=2
- 1220 RETURN
- 1230 IF ERR<>53 THEN PRINT"error":END
- 1240 ON ERROR GOTO 1260
- 1250 OPEN"i",1,"b:globe.dat:":GOTO 250
- 1260 IF ERR=53 THEN RESUME 1250 ELSE 1230
- 1270 RESUME 470
- 1280 END' of Program
-